package com.edu.handler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 *  自定义 InvocationHandler  用于制定强化的规则
 *      a.实现 InvocationHandler接口
 *      b.重写方法
 *      c.构造方法中 应该传入 被代理对象
 */
public class MyHandler implements InvocationHandler{

    private Object obj;//用于接收 被强化对象

    public MyHandler(Object obj){
        this.obj = obj; //构造方法中 传入被强化对象
    }

    /**
     *  invoke 用于表示 被代理的每一个方法的执行.
     * @param proxy
     * @param method
     * @param args
     *          proxy 代表 代理对象
     *          method 代表被代理对象要执行的方法
     *          args 代表方法执行时传入的参数
     * @return  方法执行完毕后返回的结果
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 前置增强代码s
//        System.out.println(method.getName()+"开始执行与:"+new Date());
        if(obj.getClass().getSimpleName()=="UserServiceImpl" || obj.getClass().getSimpleName() == "BookServiceImpl"){  //确定了 目标对象
            if(method.getName().startsWith("select")){ //确定了切点
                // 前置通知
                Object result = null;
                try {
                     result = method.invoke(obj, args);//真正执行 业务方法
                     // 后置放回通知
                    return result;

                }catch(Exception e){
                    System.out.println("发生了异常");//后置异常通知
                } finally{
                    // 后置通知
                }

                return result;
            }
        }

        Object result = method.invoke(obj,args);
        return result;

    }
}
